How to map a composite key with JPA and Hibernate?

前端 未结 8 1236
旧时难觅i
旧时难觅i 2020-11-22 10:37

In this code, how to generate a Java class for the composite key (how to composite key in hibernate):

create table Time (
     levelStation int(15) not null,         


        
相关标签:
8条回答
  • 2020-11-22 11:01

    Using hbm.xml

        <composite-id>
    
            <!--<key-many-to-one name="productId" class="databaselayer.users.UserDB" column="user_name"/>-->
            <key-property name="productId" column="PRODUCT_Product_ID" type="int"/>
            <key-property name="categoryId" column="categories_id" type="int" />
        </composite-id>  
    

    Using Annotation

    Composite Key Class

    public  class PK implements Serializable{
        private int PRODUCT_Product_ID ;    
        private int categories_id ;
    
        public PK(int productId, int categoryId) {
            this.PRODUCT_Product_ID = productId;
            this.categories_id = categoryId;
        }
    
        public int getPRODUCT_Product_ID() {
            return PRODUCT_Product_ID;
        }
    
        public void setPRODUCT_Product_ID(int PRODUCT_Product_ID) {
            this.PRODUCT_Product_ID = PRODUCT_Product_ID;
        }
    
        public int getCategories_id() {
            return categories_id;
        }
    
        public void setCategories_id(int categories_id) {
            this.categories_id = categories_id;
        }
    
        private PK() { }
    
        @Override
        public boolean equals(Object o) {
            if ( this == o ) {
                return true;
            }
    
            if ( o == null || getClass() != o.getClass() ) {
                return false;
            }
    
            PK pk = (PK) o;
            return Objects.equals(PRODUCT_Product_ID, pk.PRODUCT_Product_ID ) &&
                    Objects.equals(categories_id, pk.categories_id );
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(PRODUCT_Product_ID, categories_id );
        }
    }
    

    Entity Class

    @Entity(name = "product_category")
    @IdClass( PK.class )
    public  class ProductCategory implements Serializable {
        @Id    
        private int PRODUCT_Product_ID ;   
    
        @Id 
        private int categories_id ;
    
        public ProductCategory(int productId, int categoryId) {
            this.PRODUCT_Product_ID = productId ;
            this.categories_id = categoryId;
        }
    
        public ProductCategory() { }
    
        public int getPRODUCT_Product_ID() {
            return PRODUCT_Product_ID;
        }
    
        public void setPRODUCT_Product_ID(int PRODUCT_Product_ID) {
            this.PRODUCT_Product_ID = PRODUCT_Product_ID;
        }
    
        public int getCategories_id() {
            return categories_id;
        }
    
        public void setCategories_id(int categories_id) {
            this.categories_id = categories_id;
        }
    
        public void setId(PK id) {
            this.PRODUCT_Product_ID = id.getPRODUCT_Product_ID();
            this.categories_id = id.getCategories_id();
        }
    
        public PK getId() {
            return new PK(
                PRODUCT_Product_ID,
                categories_id
            );
        }    
    }
    
    0 讨论(0)
  • 2020-11-22 11:03

    Another option is to map is as a Map of composite elements in the ConfPath table.

    This mapping would benefit from an index on (ConfPathID,levelStation) though.

    public class ConfPath {
        private Map<Long,Time> timeForLevelStation = new HashMap<Long,Time>();
    
        public Time getTime(long levelStation) {
            return timeForLevelStation.get(levelStation);
        }
    
        public void putTime(long levelStation, Time newValue) {
            timeForLevelStation.put(levelStation, newValue);
        }
    }
    
    public class Time {
        String src;
        String dst;
        long distance;
        long price;
    
        public long getDistance() {
            return distance;
        }
    
        public void setDistance(long distance) {
            this.distance = distance;
        }
    
        public String getDst() {
            return dst;
        }
    
        public void setDst(String dst) {
            this.dst = dst;
        }
    
        public long getPrice() {
            return price;
        }
    
        public void setPrice(long price) {
            this.price = price;
        }
    
        public String getSrc() {
            return src;
        }
    
        public void setSrc(String src) {
            this.src = src;
        }
    }
    

    Mapping:

    <class name="ConfPath" table="ConfPath">
        <id column="ID" name="id">
            <generator class="native"/>
        </id>
        <map cascade="all-delete-orphan" name="values" table="example"
                lazy="extra">
            <key column="ConfPathID"/>
            <map-key type="long" column="levelStation"/>
            <composite-element class="Time">
                <property name="src" column="src" type="string" length="100"/>
                <property name="dst" column="dst" type="string" length="100"/>
                <property name="distance" column="distance"/>
                <property name="price" column="price"/>
            </composite-element>
        </map>
    </class>
    
    0 讨论(0)
提交回复
热议问题