0

私は多対多の関係を試みています。チームメンバーは複数のプロジェクトに取り組むことができ、プロジェクトは複数のチームメンバーを持つことができます。テーブルの構造は次のとおりです。

create table TBL_PROJECT_ONE(
       id integer primary key generated always as identity(start with 12,increment by 3),
       name varchar(50)
)

create table TBL_TEAM_MEMBER_ONE(
    id integer primary key generated always as identity(start with 7,increment by 5),
    name varchar(50),
    salary integer
)

create table EMP_PRJ_CADRE(
    MEMBER_ID integer references TBL_TEAM_MEMBER_ONE,
    PRJ_ID integer references TBL_PROJECT_ONE,
    CADRE varchar(10),
    constraint PK_001_EMP_TEAM primary key (MEMBER_ID,PRJ_ID)
)

ここでは、関係を保存するためだけに新しいテーブルを作成しました。次に、Employeeエンティティに従ってください。

@Entity
@Table(name="TBL_TEAM_MEMBER_ONE")
public class EmployeeEntityFour implements Serializable{
   public EmployeeEntityFour(){}
   public EmployeeEntityFour(String empName,Integer salary){
   ...
   ..
   }
   @Id
   @GeneratedValue(strategy= GenerationType.IDENTITY)
   @Column(name="ID")
   private Integer empId;

   @Column(name="NAME")
   private String empName;

   @Column(name="SALARY")
   private Integer empSal;

   @ElementCollection(fetch= FetchType.LAZY)
   @CollectionTable(name="EMP_PRJ_CADRE")
   @MapKeyJoinColumn(name="PRJ_ID")
   @Column(name="CADRE")
   private Map<ProjectEntityOne,String> employeeCadre;
   ...
   ..
   .
}

プロジェクトエンティティのマッピングに従ってください。

@Entity
@Table(name="TBL_PROJECT_ONE")
public class ProjectEntityOne implements Serializable{
   public ProjectEntityOne(){}
   public ProjectEntityOne(String name){
     this.projectName = name;
   }

   @Id
   @GeneratedValue(strategy= GenerationType.IDENTITY)
   @Column(name="ID")
   private Integer projectId;

   @Column(name="NAME")
   private String projectName;    

   @ElementCollection(fetch= FetchType.LAZY)
   @CollectionTable(name="EMP_PRJ_CADRE")
   @MapKeyJoinColumn(name="MEMBER_ID")
   @Column(name="CADRE")
   private Map<EmployeeEntityFour,String> employeeCadre;
   ....
   ..
   .
}

主なメソッドテストでは、記述されたコードは次のとおりです。

ProjectEntityOne proj = new ProjectEntityOne("Citi Grand Central");        
Map<EmployeeEntityFour,String> cadreMap = new HashMap<EmployeeEntityFour,String>();
cadreMap.put(new EmployeeEntityFour("Murlinarayan Muthu",34000), "Senior Software Engineer");
cadreMap.put(new EmployeeEntityFour("Gopalkrishna Rajnathan",64000), "Software Engineer");
cadreMap.put(new EmployeeEntityFour("Premanna Swaminathan",94000), "Project Manager");

proj.setEmployeeCadre(cadreMap);

em.persist(proj);

しかし、私はエラーが発生しています

ERROR: 'PROJECTENTITYONE_ID' is not a column in table or VTI 'APP.EMP_PRJ_CADRE'.

両方のエンティティで@MapKeyJoinColumnを指定した場合も、3番目のテーブルの不適切な列としてエラーが発生します。

私が行方不明の場所

4

2 に答える 2

1

それはどういうわけかうまくいきました、私はコードにいくつかの変更をしなければなりませんでした、

まず、EntityProjectEntityOneで編集されたコードは次のとおりです。

@ElementCollection(fetch= FetchType.LAZY)
@CollectionTable(name="EMP_PRJ_CADRE",joinColumns=@JoinColumn(name="PRJ_ID"))
@MapKeyJoinColumn(name="MEMBER_ID")
@Column(name="CADRE")    
private Map<EmployeeEntityFour,String> employeeCadre;

ここで行ったことは、@CollectionTableに@JoinedColumnを追加したことです。

Entity EmployeeEntityFourで行った2番目の変更は、PorjectEntityOneのマップを削除したことです。

テストでは、従業員マッピングを使用してプロジェクトを保存できますが、ここではすべての従業員がすでに1人保存されているはずです。つまり、地図の鍵

Map<EmployeeEntityFour,String> employeeCadre;

すでに永続化されている必要があり、プロジェクトエンティティを永続化できます。

于 2013-03-21T13:55:17.900 に答える
0

EmployeeEntityFourのemployeeCadreには、@ JoinColumn(name = "MEMBER_ID")が必要であり、ProjectEntityOne employeeCadreには@JoinColumn(name = "PRJ_ID")も必要です。

しかし、私はそれをこのようにモデル化することはしません。まず第一に、双方向のElementCollectionマッピングを持つことはできず、ElementCollectionは片側だけが所有できます。最善の解決策は、EMP_PRJ_CADREテーブルにマッピングするCadreエンティティを定義し、両側からOneToManyを設定し、それぞれにManyToOneを設定することです。

または、MapKeyColumnでManyToManyを使用することもできますが、エンティティを使用する方がよいと思います。

于 2013-03-21T13:02:15.160 に答える