我对Java EE和JPA/Eclipselink非常陌生,所以请耐心听我说。我试图为一个没有主键和两个复合键的表创建一个Id,我试图通过使用IdClass将两个外键标记为复合键来应用我在这里读到的解决方案,但在编译和部署服务器时出现了此错误。
异常描述:组合主键规范无效。主键类[com.owl.server.objects.SaleDetails]和实体bean类[com.owl.server.objects.SaleDetails]中的主键字段或属性的名称必须对应,并且它们的类型必须相同。此外,请确保已为XML中的相应属性指定了ID元素和/或在实体类的相应字段或属性上指定了@ID。。请参阅服务器。有关详细信息,请登录。
我必须将字段类型更改为相同吗?还是有其他方法?
产品表及对应实体
@Entity
@Table(name="products")
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "product_id", nullable = false)
private String product_id;
// ...
}
销售表及对应实体
@Entity
@Table(name="Sales")
public class Sale implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "sale_id", nullable = false)
private int sale_id;
// ...
}
Sale\u details表和实体(导致错误)
public class SaleDetails implements Serializable {
private int saleid_fk;
private String productid_fk;
private int quantity_sold;
private String prescription;
public SaleDetails() {
}
public SaleDetails(int saleid_fk, String productid_fk, int quantity_sold){
this.saleid_fk = saleid_fk;
this.productid_fk = productid_fk;
this.quantity_sold = quantity_sold;
}
}
Sale\u details实体类
@Entity
@IdClass(SaleDetails.class)
@Table(name = "sale_Details")
public class Sale_details {
@Id
private int saleid_fk;
@Id
private String productid_fk;
}
以下是完整堆栈跟踪错误:
[2020-12-24 11:43:50,553] Artifact server:war exploded: java.io.IOException: com.sun.enterprise.admin.remote.RemoteFailureException: Error occurred during deployment: Exception while preparing the app : Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.7.7.payara-p3): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [owlJPA] failed.
Internal Exception: Exception [EclipseLink-7150] (Eclipse Persistence Services - 2.7.7.payara-p3): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Invalid composite primary key specification. The names of the primary key fields or properties in the primary key class [com.owl.server.objects.SaleDetails] and those of the entity bean class [class com.owl.server.objects.Sale_details] must correspond and their types must be the same. Also, ensure that you have specified ID elements for the corresponding attributes in XML and/or an @Id on the corresponding fields or properties of the entity class.. Please see server.log for more details.
您可以使用“派生标识”;这是使用嵌入ID映射关系的方法:
@Embeddable
public class SaleDetailId {
@Column(name = "product_id")
String productId; // corresponds to PK type of Product
@Column(name = "sale_id")
int saleId; // corresponds to PK type of Sale
}
@Entity
@Table(name = "sale_details")
public class SaleDetail {
@EmbeddedId
SaleDetailId id;
// id attribute mapped by join column default
@MapsId("saleId") // maps saleId attribute of embedded id
@ManyToOne
private Sale sale;
// id attribute mapped by join column default
@MapsId("productId") // maps productId attribute of embedded id
@ManyToOne
private Product product;
@Column(name = "quantity_sold")
private int quantitySold;
public SaleDetails(Sale sale, Product product, int quantity_sold){
this.sale = sale;
this.product = product;
this.quantity_sold = quantity_sold;
}
// ...
}
要使用IdClass映射关系,请执行以下操作:
public class SaleDetailId {
int sale; // matches name of @Id attribute and type of Sale PK
String product; // matches name of @Id attribute and type of Product PK
}
@Entity
@IdClass(SaleDetailId.class)
@Table(name = "sale_details")
public class SaleDetail {
// id attribute mapped by join column default
@Id
@ManyToOne
@JoinColumn(name = "sale_id")
private Sale sale;
// id attribute mapped by join column default
@Id
@ManyToOne
@JoinColumn(name = "product_id")
private Product product;
@Column(name = "quantity_sold")
private int quantitySold;
public SaleDetails(Sale sale, Product product, int quantity_sold){
this.sale = sale;
this.product = product;
this.quantity_sold = quantity_sold;
}
// ...
}
派生标识在第2.4.1节的JPA 2.2规范中进行了讨论(带有示例)。
Idclass值不应是实体“SaleDetails”的同一类
@Entity
@IdClass(PK.class)
public static class SystemUser{
@Id
private String subsystem;
@Id
private String username;
public PK getId(){
return new PK(subsystem, username);
}
public void setId(PK id){
this.subsystem = id.subsystem;
this.username = id.username;
}
}
public static class PK implements Serializable {
private String subsystem;
private String username;
public PK(String subsystem, String username) {
this.subsystem = subsystem;
this.username = username;
}
}
我正在使用productid作为电话表中的外键。我不知道在PhoneRepository的id部分写什么。因为给出错误 Product.java phone.java PhoneRepository.Java 错误
如何使用hibernate注释实现下表? 当前代码为:(为简洁起见,已删除) 使用者 社交网络 SocialProfile公司 显然我的代码现在不能正常工作。有人能解释一下吗?
我有两个表,在我的Spring代码中是学生和课程。我想创建一个关系表,“获取课程”。我只有学生ID和课程ID。我可以在我的java代码中创建一个具有两个主键的表,但我不能将它们声明为外键。 我尝试了这个解决方案,将两个外键作为主键,但没有成功,我认为其中缺少了一些部分。因此,我尝试了基于此解决方案的方法: (学生实体有id, name, surname)(课程实体有id, Coursename)
在实体框架中,我想使用两个外键作为另一个实体类型的主键。 但是,这会给我一个缺少键的错误。 我知道我可以定义另外两个属性来保存引用实体类型的主键。Visual Studio是否不够聪明,无法自行使用它们的主键?
本文向大家介绍django foreignkey(外键)的实现,包括了django foreignkey(外键)的实现的使用技巧和注意事项,需要的朋友参考一下 foreignkey是一种关联字段,将两张表进行关联的方式,我们在dodels.py里写入要生成的两张表: 运行下面两条命令: C:\Users\Liujiangbu.GLOBALE.001\PycharmProjects\untitled
我是SQL新手,正在尝试创建一个如下的模式。然而,我似乎不能正确获得成员表的外键。我试着在表创建后添加它,最初似乎工作正常,但现在当我试图添加一个测试数据行时,我得到了这个错误。 我敢肯定,这是我错过的非常愚蠢的事情,但如果有人能指出我做错了什么,那就太好了! 错误代码:1452。无法添加或更新子行:外键约束失败 (。,CONSTRAINTFOREIGN KEY()REFERENCES()) 无法