休眠中的 COMPOSITE-ID
COMPOSITE-ID in hibernate
来自
https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html
我不知道如何在没有 "class" 参数的情况下使用 "composite-id" 标签,而我设法 Google 使事情变得更加混乱的那几个例子。
所以我的例子
<class name="mainPack.Point" table="POINT">
<composite-id>
<key-property name="x" type="int">
<column name="X" />
</key-property>
<key-property name="y" type="int">
<column name="Y" />
</key-property>
</composite-id>
<property name="str" type="java.lang.String">
<column name="STR" />
</property>
</class>
有用吗?
将列
<column name="X" />
<column name="Y" />
出现在table?
是否会创建另一个包含新 "id class" 的映射 table,以及两个参数 "X"、"Y"?
Will it work?
是的。我用 hibernate-update
创建了一个 table,这是结果:
CREATE TABLE point
(
x integer NOT NULL,
y integer NOT NULL,
str character varying(255),
CONSTRAINT point_pkey PRIMARY KEY (x, y)
)
-
Will columns be present in the table?
Yes. You can see it above.
-
And will there be created another mapping table containing new "id
class", with two parameter "X", "Y"?
No.
这里是java class:
public class Point implements Serializable {
private int x;
private int y;
private String str;
public int getX() {
return this.x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return this.y;
}
public void setY(int y) {
this.y = y;
}
public String getStr() {
return this.str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(this.x).append(this.y).toHashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Point)) {
return false;
}
Point other = (Point) obj;
return (this.getX() == other.getX()) && (this.getY() == other.getY());
}
}
// Composite primary key bean
import java.io.Serializable;
public class CoursePk implements Serializable {
private static final long serialVersionUID = 1L;
private String title;
private String tutor;
public CoursePk(){
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getTutor() {
return tutor;
}
public void setTutor(String tutor) {
this.tutor = tutor;
}
}
// Course class for composite primary key
@Entity
@Table(name="course")
public class Course implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId // composite key
private CoursePk id=null;
private int totalStudents;
public int getTotalStudents() {
return totalStudents;
}
public void setTotalStudents(int totalStudents) {
this.totalStudents = totalStudents;
}
public CoursePk getId() {
return id;
}
public void setId(CoursePk id) {
this.id = id;
}
}
// Hibernate Util to get Session factory
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private HibernateUtil(){
}
private static SessionFactory sessionFactory ;
static {
Configuration configuration = new Configuration();
configuration.addAnnotatedClass (Course.class);
configuration.setProperty("connection.driver_class","com.mysql.jdbc.Driver");
configuration.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/hibernate");
configuration.setProperty("hibernate.connection.username", "root");
configuration.setProperty("hibernate.connection.password", "root");
configuration.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");
configuration.setProperty("hibernate.hbm2ddl.auto", "update");
configuration.setProperty("hibernate.show_sql", "true");
configuration.setProperty(" hibernate.connection.pool_size", "10");
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
sessionFactory = configuration.buildSessionFactory(builder.build());
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public static HibernateUtil getInstance(){
return new HibernateUtil();
}
}
// Main Class for testing composite primary key
public class CompositePrimaryKeyTest {
public static void main(String[] args) {
CoursePk pk=new CoursePk();
pk.setTitle("Java Book");
pk.setTutor("Deepak");
Course course=new Course();
course.setTotalStudents(100);
course.setId(pk);
Session session=HibernateUtil.getInstance().getSessionFactory().openSession();
session.beginTransaction();
session.save(course);
session.getTransaction().commit();
}
}
来自
https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html
我不知道如何在没有 "class" 参数的情况下使用 "composite-id" 标签,而我设法 Google 使事情变得更加混乱的那几个例子。
所以我的例子
<class name="mainPack.Point" table="POINT">
<composite-id>
<key-property name="x" type="int">
<column name="X" />
</key-property>
<key-property name="y" type="int">
<column name="Y" />
</key-property>
</composite-id>
<property name="str" type="java.lang.String">
<column name="STR" />
</property>
</class>
有用吗?
将列
<column name="X" />
<column name="Y" />
出现在table?
是否会创建另一个包含新 "id class" 的映射 table,以及两个参数 "X"、"Y"?
Will it work?
是的。我用 hibernate-update
创建了一个 table,这是结果:
CREATE TABLE point
(
x integer NOT NULL,
y integer NOT NULL,
str character varying(255),
CONSTRAINT point_pkey PRIMARY KEY (x, y)
)
-
Will columns be present in the table?
-
And will there be created another mapping table containing new "id class", with two parameter "X", "Y"?
这里是java class:
public class Point implements Serializable {
private int x;
private int y;
private String str;
public int getX() {
return this.x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return this.y;
}
public void setY(int y) {
this.y = y;
}
public String getStr() {
return this.str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(this.x).append(this.y).toHashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Point)) {
return false;
}
Point other = (Point) obj;
return (this.getX() == other.getX()) && (this.getY() == other.getY());
}
}
// Composite primary key bean
import java.io.Serializable;
public class CoursePk implements Serializable {
private static final long serialVersionUID = 1L;
private String title;
private String tutor;
public CoursePk(){
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getTutor() {
return tutor;
}
public void setTutor(String tutor) {
this.tutor = tutor;
}
}
// Course class for composite primary key
@Entity
@Table(name="course")
public class Course implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId // composite key
private CoursePk id=null;
private int totalStudents;
public int getTotalStudents() {
return totalStudents;
}
public void setTotalStudents(int totalStudents) {
this.totalStudents = totalStudents;
}
public CoursePk getId() {
return id;
}
public void setId(CoursePk id) {
this.id = id;
}
}
// Hibernate Util to get Session factory
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private HibernateUtil(){
}
private static SessionFactory sessionFactory ;
static {
Configuration configuration = new Configuration();
configuration.addAnnotatedClass (Course.class);
configuration.setProperty("connection.driver_class","com.mysql.jdbc.Driver");
configuration.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/hibernate");
configuration.setProperty("hibernate.connection.username", "root");
configuration.setProperty("hibernate.connection.password", "root");
configuration.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");
configuration.setProperty("hibernate.hbm2ddl.auto", "update");
configuration.setProperty("hibernate.show_sql", "true");
configuration.setProperty(" hibernate.connection.pool_size", "10");
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
sessionFactory = configuration.buildSessionFactory(builder.build());
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public static HibernateUtil getInstance(){
return new HibernateUtil();
}
}
// Main Class for testing composite primary key
public class CompositePrimaryKeyTest {
public static void main(String[] args) {
CoursePk pk=new CoursePk();
pk.setTitle("Java Book");
pk.setTutor("Deepak");
Course course=new Course();
course.setTotalStudents(100);
course.setId(pk);
Session session=HibernateUtil.getInstance().getSessionFactory().openSession();
session.beginTransaction();
session.save(course);
session.getTransaction().commit();
}
}