JPA很多,JoinTable怎么能有一个属性?

JPA很多,JoinTable怎么能有一个属性?,jpa,many-to-many,properties,ejb,jointable,Jpa,Many To Many,Properties,Ejb,Jointable,我有一个关于在EJB中设计多线程的问题,jointable怎么能有属性呢? 这里有一个例子,学生和课程很多,每个学生都有很多课程,很多学生选择一门课程 @Entity public class Student implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) Long id; String name;

我有一个关于在EJB中设计多线程的问题,jointable怎么能有属性呢?
这里有一个例子,学生和课程很多,每个学生都有很多课程,很多学生选择一门课程

    @Entity
    public class Student implements Serializable { 
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        Long id;
        String name;
        private Collection<Course> courses; 

        @ManyToMany(mappedBy = "students",cascade=CascadeType.ALL)      
        public Collection<Course> getCourses() {
            return this.courses;
        }

        public void setCourses(Collection<Course> courses) {
            this.courses = courses;
        }

    }


    @Entity
    public class Course implements Serializable { 
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        Long id;
        String name; 
        private Collection<Student> students; 

        @ManyToMany(cascade=CascadeType.ALL)
        @JoinTable(name = "Student_Course",
        joinColumns = {@JoinColumn(name = "Course_ID", referencedColumnName = "id")}, 
        inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName = "id")})  

        public Collection<Student> getStudents() {
            return this.students;
        }

        public void setStudents(Collection<Student> students) {
            this.students = students;
        }
    }
@实体
公共类学生实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
长id;
字符串名;
私人收藏课程;
@许多(mappedBy=“students”,cascade=CascadeType.ALL)
公共收藏课程(){
把这本书还给我;
}
公共课程(集合课程){
本课程=课程;
}
}
@实体
公共类课程实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
长id;
字符串名;
私人收藏学生;
@多个(级联=级联类型.ALL)
@JoinTable(name=“学生\课程”,
joinColumns={@JoinColumn(name=“Course\u ID”,referencedColumnName=“ID”)},
inverseJoinColumns={@JoinColumn(name=“Student\u ID”,referencedColumnName=“ID”)}
公众募捐(学生){
把这个还给学生;
}
公立学校学生(集合学生){
这个。学生=学生;
}
}
但是,如果JoinTable中有一个属性,例如,每个学生对一门课程都有一个分数。如何在EJB中使用多个组件实现它?

非常感谢您的关注

这是不可能的,您不能将属性添加到关系中。如果需要访问联接表中的属性,则该属性属于某个实体,因此需要第三个实体。

这是可能的

您只需要通过第三个实体将多对多映射替换为一对多和多对一映射的显式组合,这将表示两个主要实体(示例中的学生和课程)之间的关联


请阅读具有多对多关系(商户和服务)的实体的详细信息。 这可以使用第三实体实现,如下所示:-

@Entity
@Table(name = "merchant")
public class Merchant implements java.io.Serializable {

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.merchant",targetEntity = MerchantService.class)
    private Set<MerchantService> merchantServices = new HashSet<>();
}

@Entity
@Table(name = "merchant_service")
@AssociationOverrides({
        @AssociationOverride(name = "pk.merchant",
            joinColumns = @JoinColumn(name = "merchant_id")),
        @AssociationOverride(name = "pk.service",
            joinColumns = @JoinColumn(name = "service_id")) })
public class MerchantService implements java.io.Serializable {

    @EmbeddedId
    private MerchantServiceId pk = new MerchantServiceId();

    private boolean isActive;

    public MerchantServiceId getPk() {
        return pk;
    }

    public void setPk(MerchantServiceId pk) {
        this.pk = pk;
    }

    @Transient
    public Service getService() {
        return getPk().getService();
    }


    @Transient
    public Merchant getMerchant() {
        return getPk().getMerchant();
    }


    public boolean isActive() {
        return isActive;
    }

    public void setActive(boolean isActive) {
        this.isActive = isActive;
    }

}

@Embeddable
public class MerchantServiceId implements java.io.Serializable {

    private Merchant merchant;
    private Service service;

    @ManyToOne
    public Merchant getMerchant() {
        return merchant;
    }

    @ManyToOne
    public Service getService() {
        return service;
    }

}

@Entity
@Table(name = "service")
public class Service implements java.io.Serializable {

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.service",targetEntity = MerchantService.class)
    private Set<MerchantService> merchantServices = new HashSet<>();

}
@实体
@表(name=“商户”)
公共类Merchant实现java.io.Serializable{
@OneToMany(fetch=FetchType.LAZY,mappedBy=“pk.merchant”,targetEntity=MerchantService.class)
private Set merchantServices=new HashSet();
}
@实体
@表(name=“商户服务”)
@联想超越({
@AssociationOverride(name=“pk.merchant”,
joinColumns=@JoinColumn(name=“merchant_id”),
@AssociationOverride(name=“pk.service”,
joinColumns=@JoinColumn(name=“service_id”))}
公共类MerchantService实现java.io.Serializable{
@嵌入ID
private MerchantServiceId pk=新MerchantServiceId();
私有布尔非活动;
公共商品服务ID getPk(){
返回主键;
}
公共void setPk(MerchantServiceId pk){
this.pk=pk;
}
@短暂的
公共服务{
返回getPk().getService();
}
@短暂的
公共商户{
返回getPk().getMerchant();
}
公共布尔isActive(){
回报是积极的;
}
public void setActive(布尔值isActive){
this.isActive=isActive;
}
}
@可嵌入
公共类MerchantServiceId实现java.io.Serializable{
私人商人;
私人服务;
@许多酮
公共商户{
退货商户;
}
@许多酮
公共服务{
回程服务;
}
}
@实体
@表(name=“service”)
公共类服务实现java.io.Serializable{
@OneToMany(fetch=FetchType.LAZY,mappedBy=“pk.service”,targetEntity=MerchantService.class)
private Set merchantServices=new HashSet();
}

如果您的关系具有属性,则应将其建模为实体。这个问题几乎是一样的:即使是表示关系的实体的名称(CourseAssignment)也非常适合您的情况。这是不可能的,您不能向关系添加属性。如果您需要访问联接表中的属性,那么该属性属于某个实体,因此您需要第三个实体。非常感谢Mikko Maunu!对于很多人来说,这里有一个很好的解决方案:对不起,我纠正了这个问题。我还有一个问题,当我使用@Embeddeble类作为jointable的PK时,它不起作用(编译失败),有人说JPA2.0不支持!请看这个,有什么办法可以让它工作吗?