休眠中的 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"?

  1. 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)
)

  1. Will columns be present in the table?

Yes. You can see it above.

  1. 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();
}
}