违反了JPA实体和数据库表映射验证约束

违反了JPA实体和数据库表映射验证约束,jpa,database-design,netbeans,Jpa,Database Design,Netbeans,我有两张桌子: CREATE TABLE [LeTYPE]( [LeNAME] [varchar](100) NOT NULL, [Le_DESC] [varchar](500) NULL, [LeFOR] [varchar](50) NOT NULL, CONSTRAINT [PK_LeTYPE] PRIMARY KEY CLUSTERED ( [LeNAME] ASC ) ) CREATE TABLE [Le]( [SN] [int] IDEN

我有两张桌子:

 CREATE TABLE [LeTYPE](
    [LeNAME] [varchar](100) NOT NULL,
    [Le_DESC] [varchar](500) NULL,
    [LeFOR] [varchar](50) NOT NULL,
 CONSTRAINT [PK_LeTYPE] PRIMARY KEY CLUSTERED 
(
    [LeNAME] ASC
)
)

CREATE TABLE [Le](
    [SN] [int] IDENTITY(1,1) NOT NULL,
    [LeNAME_FK] [varchar](100) NOT NULL,
    [Le_SN] [int] NULL,
    [LOWERRANGE] [float] NOT NULL,
    [UPPERRANGE] [float] NOT NULL,
    [Le_DESC] [varchar](500) NULL,
    [COLOR] [varchar](45) NULL,
 CONSTRAINT [Le_pk] PRIMARY KEY CLUSTERED 
(
    [SN] ASC
))
GO


ALTER TABLE [Le]  WITH CHECK ADD  CONSTRAINT [FK_Le_LeTYPE] FOREIGN KEY([LeNAME_FK])
REFERENCES [LeTYPE] ([LeNAME])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [Le] CHECK CONSTRAINT [FK_Le_LeTYPE]
GO
public class Letype implements Serializable {
    ...
    @OneToMany(mappedBy="letype")
    private List<Le> les;
}
public class Le implements Serializable {
    ...
    @ManyToOne
    @JoinColumn(name = "Letype_FK", referencedColumnName = "LENAME")
    private Letype letype;
}
LETYPE中的一个元组将有多个元组。

netbeans生成的JPA实体:

     public class Letype implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 100)
    @Column(nullable = false, length = 100)
    private String Lename;
    @Size(max = 500)
    @Column(name = "Le_DESC", length = 500)
    private String LeDesc;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 50)
    @Column(nullable = false, length = 50)
    private String Lefor;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "LenameFk", fetch = FetchType.LAZY)
    private List<Le> LeList;
}



public class Le implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @NotNull
    @Column(nullable = false)
    private Integer sn;
    @Column(name = "Le_SN")
    private Integer LeSn;
    @Basic(optional = false)
    @NotNull
    @Column(nullable = false)
    private double lowerrange;
    @Basic(optional = false)
    @NotNull
    @Column(nullable = false)
    private double upperrange;
    @Size(max = 500)
    @Column(name = "Le_DESC", length = 500)
    private String LeDesc;
    @Size(max = 45)
    @Column(length = 45)
    private String color;
    @JoinColumn(name = "LeNAME_FK", referencedColumnName = "LeNAME", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Letype LenameFk;
}
netbean生成的实体的结构具有
letypeList
,带有in-Le,而不是相反。
我的数据库结构是错误的还是如何做正确的?

是的,我觉得您在数据库中的
LE
LETYPE
之间的关系是错误的

从JPA的角度来看,当前关系被视为一个
LE
可以有多个
LETYPE
,这就是为什么您在
LE
实体类中看到下面的代码

     @OneToMany(mappedBy = "LeFk")
     private List<Letype> letypeList; 
@OneToMany(mappedBy=“LeFk”)
私有列表类型列表;
但这是错误的,您需要反向关系,即,One
LETYPE
可以有多个
LE
(一对多)

基本上,您的
数据库结构
是错误的,我想,您必须在
LE
表中维护FK列,正如您当前在
LETYPE
中维护的那样

在数据库世界中,FK列始终位于Many侧,即
LE

现在该做什么

  • 删除
    LETYPE
    表中的FK列
  • 参考
    LETYPE
    表主键,在
    LE
    表中添加FK列
  • 再次生成JPA实体
  • 然后你会看到正确的JPA代码和正确的关系

我希望你们能做你们需要的事。

是的,我觉得你们在数据库中找到了
LE
LETYPE
之间的错误关系

从JPA的角度来看,当前关系被视为一个
LE
可以有多个
LETYPE
,这就是为什么您在
LE
实体类中看到下面的代码

     @OneToMany(mappedBy = "LeFk")
     private List<Letype> letypeList; 
@OneToMany(mappedBy=“LeFk”)
私有列表类型列表;
但这是错误的,您需要反向关系,即,One
LETYPE
可以有多个
LE
(一对多)

基本上,您的
数据库结构
是错误的,我想,您必须在
LE
表中维护FK列,正如您当前在
LETYPE
中维护的那样

在数据库世界中,FK列始终位于Many侧,即
LE

现在该做什么

  • 删除
    LETYPE
    表中的FK列
  • 参考
    LETYPE
    表主键,在
    LE
    表中添加FK列
  • 再次生成JPA实体
  • 然后你会看到正确的JPA代码和正确的关系

我希望你们能做你们需要的事。

是的,我觉得你们在数据库中找到了
LE
LETYPE
之间的错误关系

从JPA的角度来看,当前关系被视为一个
LE
可以有多个
LETYPE
,这就是为什么您在
LE
实体类中看到下面的代码

     @OneToMany(mappedBy = "LeFk")
     private List<Letype> letypeList; 
@OneToMany(mappedBy=“LeFk”)
私有列表类型列表;
但这是错误的,您需要反向关系,即,One
LETYPE
可以有多个
LE
(一对多)

基本上,您的
数据库结构
是错误的,我想,您必须在
LE
表中维护FK列,正如您当前在
LETYPE
中维护的那样

在数据库世界中,FK列始终位于Many侧,即
LE

现在该做什么

  • 删除
    LETYPE
    表中的FK列
  • 参考
    LETYPE
    表主键,在
    LE
    表中添加FK列
  • 再次生成JPA实体
  • 然后你会看到正确的JPA代码和正确的关系

我希望你们能做你们需要的事。

是的,我觉得你们在数据库中找到了
LE
LETYPE
之间的错误关系

从JPA的角度来看,当前关系被视为一个
LE
可以有多个
LETYPE
,这就是为什么您在
LE
实体类中看到下面的代码

     @OneToMany(mappedBy = "LeFk")
     private List<Letype> letypeList; 
@OneToMany(mappedBy=“LeFk”)
私有列表类型列表;
但这是错误的,您需要反向关系,即,One
LETYPE
可以有多个
LE
(一对多)

基本上,您的
数据库结构
是错误的,我想,您必须在
LE
表中维护FK列,正如您当前在
LETYPE
中维护的那样

在数据库世界中,FK列始终位于Many侧,即
LE

现在该做什么

  • 删除
    LETYPE
    表中的FK列
  • 参考
    LETYPE
    表主键,在
    LE
    表中添加FK列
  • 再次生成JPA实体
  • 然后你会看到正确的JPA代码和正确的关系
我希望您能够完成所需的工作。

“我想要的是,如果我从JSF视图添加一个LETYPE,我希望同时添加多个LE”,这意味着可以将LETYPE视为组件类,将LE视为复合类,因此您应该反转映射注释。为了说明这一点以及@Jayasagar另外解释的内容,这两个类的形式如下所示:

Letype.java:

 CREATE TABLE [LeTYPE](
    [LeNAME] [varchar](100) NOT NULL,
    [Le_DESC] [varchar](500) NULL,
    [LeFOR] [varchar](50) NOT NULL,
 CONSTRAINT [PK_LeTYPE] PRIMARY KEY CLUSTERED 
(
    [LeNAME] ASC
)
)

CREATE TABLE [Le](
    [SN] [int] IDENTITY(1,1) NOT NULL,
    [LeNAME_FK] [varchar](100) NOT NULL,
    [Le_SN] [int] NULL,
    [LOWERRANGE] [float] NOT NULL,
    [UPPERRANGE] [float] NOT NULL,
    [Le_DESC] [varchar](500) NULL,
    [COLOR] [varchar](45) NULL,
 CONSTRAINT [Le_pk] PRIMARY KEY CLUSTERED 
(
    [SN] ASC
))
GO


ALTER TABLE [Le]  WITH CHECK ADD  CONSTRAINT [FK_Le_LeTYPE] FOREIGN KEY([LeNAME_FK])
REFERENCES [LeTYPE] ([LeNAME])
ON UPDATE CASCADE
ON DELETE CASCADE
GO

ALTER TABLE [Le] CHECK CONSTRAINT [FK_Le_LeTYPE]
GO
public class Letype implements Serializable {
    ...
    @OneToMany(mappedBy="letype")
    private List<Le> les;
}
public class Le implements Serializable {
    ...
    @ManyToOne
    @JoinColumn(name = "Letype_FK", referencedColumnName = "LENAME")
    private Letype letype;
}
“我想要的是,如果我从JSF视图添加一个LETYPE,我想添加多个