【问题标题】:Hibernate @EmbeddedId + join休眠 @EmbeddedId + 加入
【发布时间】:2013-05-22 10:06:28
【问题描述】:

我遇到了休眠映射问题。我有以下两个数据库表(我不允许更改数据库):

LOCATIONS {
   ID, -- PK
   NAME
}

LOCATION_GROUPS {
   LOC_ID, -- PK, and FK to LOCATIONS.ID
   GROUP_NAME -- PK
}

我尝试为这些数据库表创建实体,但我不知道如何映射表之间的连接。这是我的尝试(但它是错误的):

可嵌入类

    @Embeddable
    public class LocationGroupId implements Serializable {

        private static final long serialVersionUID = -6437671620548733621L;
        private Location loc;  
        private String group;   
        
        @Column(name = "LOC_ID")
        public Location getLoc() {
            return loc;
        }
        
        @Column(name = "GROUP_NAME")
        public String getGroup() {
            return group;
        }
        
        // ...
    }   

使用了EmbeddedId

    @Entity
    @Table(name = "LOCATION_GROUPS")
    public class LocationGroup {

        private LocationGroupId id;

        @EmbeddedId
        public LocationGroupId getId() {
            return id;
        }
        
        // ...
    }
    @Entity
    @Table(name = "LOCATIONS")
    public class Location {

        private Long id;
        private String name;
        private List<LocationGroup> groups;
        
        @Column(name = "NAME")
        public String getName() {
            return this.name;
        }
        
        @OneToMany(mappedBy = "id.loc")
        public List<LocationGroup> getGroups() {
            return this.groups;
        }
        
        @Id
        @Column(name = "ID")
        @SequenceGenerator(name = "LocationIdGen", sequenceName = "LOCATION_SQ")
        @GeneratedValue(strategy = GenerationType.AUTO, generator = "LocationIdGen")
        public Long getId() {
            return this.id;
        }
        
        // ...
    }

困难在于我想在列和embeddedId 列的一部分之间建立OneToMany 连接。 对这个问题有任何想法吗? (我使用的是休眠 4.0.1)

【问题讨论】:

    标签: hibernate mapping one-to-many


    【解决方案1】:

    该位置必须使用@JoinColumn 映射,而不是@Column:

    @JoinColumn(name = "LOC_ID")
    public Location getLoc() {
        return loc;
    }
    

    请注意,这不是标准的 JPA。为了使其成为标准,您将使用

    可嵌入类

    @Embeddable
    public class LocationGroupId implements Serializable {
    
        private static final long serialVersionUID = -6437671620548733621 L;
        private Long locationId;
        private String group;
    
        @Column(name = "LOC_ID")
        public Long getLocationId() {
            return loc;
        }
    
        @Column(name = "GROUP_NAME")
        public String getGroup() {
            return group;
        }
        // ...
    }
    

    已使用EmbeddedId

    @Entity
    @Table(name = "LOCATION_GROUPS")
    public class LocationGroup {
    
        private LocationGroupId id;
        private Location location;
    
        @EmbeddedId
        public LocationGroupId getId() {
            return id;
        }
    
        @ManyToOne
        @JoinColumn(name = "LOC_ID")
        @MapsId("locationId")
        private Location getLocation() {
            return location;
        }
        // ...
    }
    

    这两个映射在the documentation 中有解释。

    【讨论】:

    • JB Nizet,谢谢你的回答。在阅读您的答案之前,我找到了该页面:beavercreekconsulting.com/blog/2008/10/… 并使用了该页面。但我很欣赏你的回答,并接受它作为解决方案:)
    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2011-12-20
    • 2016-03-15
    • 2020-01-05
    • 2018-07-16
    相关资源
    最近更新 更多