首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GenerationType.IDENTITY 10.4和eclipselink的java @GeneratedValue问题(策略= GenerationType.IDENTITY)

使用GenerationType.IDENTITY 10.4和eclipselink的java @GeneratedValue问题(策略= GenerationType.IDENTITY)
EN

Stack Overflow用户
提问于 2020-05-09 02:10:49
回答 2查看 1.3K关注 0票数 0

我正在Java中开发一个REST web服务,我使用的是: Glassfish 5.0 (build 25)、MariaDB 10.4和eclipselink (JPA2.1)--这里是我的代码:

commande_line表

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `cooldb`.`commande_line` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `quantity` INT NULL,
  `discount` INT NULL,
  `dish` INT NOT NULL,
  `commande` INT NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC),
  INDEX `fk_commande_line_dish1_idx` (`dish` ASC),
  INDEX `fk_commande_line_commande1_idx` (`commande` ASC),
  CONSTRAINT `fk_commande_line_dish1`
    FOREIGN KEY (`dish`)
    REFERENCES `cooldb`.`dish` (`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_commande_line_commande1`
    FOREIGN KEY (`commande`)
    REFERENCES `cooldb`.`commande` (`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

persistance.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
  <!-- Define Persistence Unit -->
  <persistence-unit name="my_persistence_unit" transaction-type="JTA">
    <jta-data-source>jdbc/mariadb</jta-data-source>
    <class>com.yac.model.Address</class>
    <class>com.yac.model.Commande</class>
    <class>com.yac.model.CommandeLine</class>
    <class>com.yac.model.Dish</class>
    <class>com.yac.model.Dishtype</class>
    <class>com.yac.model.Ingredient</class>
    <class>com.yac.model.Payement</class>
    <class>com.yac.model.Profil</class>
    <class>com.yac.model.Restaurant</class>
    <class>com.yac.model.Userapp</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
    </properties>
  </persistence-unit>
</persistence>

命令实体

代码语言:javascript
复制
public class CommandeLine implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Column(name = "quantity")
    private Integer quantity;
    @Column(name = "discount")
    private Integer discount;
    @JoinColumn(name = "commande", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private Commande commande;
    @JoinColumn(name = "dish", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private Dish dish;
    //Constructor
    // Setter and Getter
}

命令web服务

代码语言:javascript
复制
@Stateless
@Path("commandeline")
public class CommandeLineFacadeREST extends AbstractFacade<CommandeLine> {

    @PersistenceContext(unitName = "my_persistence_unit")
    private EntityManager em;

    public CommandeLineFacadeREST() {
        super(CommandeLine.class);
    }

    @POST
    @Override
    @Consumes(MediaType.APPLICATION_JSON)
    public void create(CommandeLine entity) {
        super.create(entity);
    }

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }
}

AbstractFacade

代码语言:javascript
复制
public abstract class AbstractFacade<T> {

    private Class<T> entityClass;

    public AbstractFacade(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }
}

问题是,当我用Postman测试我的web服务时,我尝试用POST请求插入一条记录,这是我收到的错误消息:

代码语言:javascript
复制
Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.0.v20170811-d680af5): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: (conn=158) Table 'cooldb.sequence' doesn't exist
Error Code: 1146
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
    bind => [2 parameters bound]
Query: DataModifyQuery(name="SEQ_GEN_SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?") ...

我不明白为什么当我使用@GeneratedValue (strategy = GenerationType.IDENTITY)时,SEQUANCE会出现问题。当我使用@GeneratedValue (strategy = GenerationType.SEQUENCE)进行更改并使用以下脚本创建表时:

代码语言:javascript
复制
CREATE SEQUENCE SEQUANCE START WITH 1 INCREMENT BY 1;

通过应用在:Table 'customerjpa.sequence' doesn't exist JPA中显示的解决方案,但使用相同的问题

提前谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-13 01:27:28

使用克里斯注释解决了这个问题,我只是在我的persistence.xml文件中添加了以下一行:

代码语言:javascript
复制
<property name="eclipselink.target-database" value="MySQL"/>

非常感谢克里斯。所以我的新persistence.xml文件是:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <!-- Define Persistence Unit -->
    <persistence-unit name="my_persistence_unit" transaction-type="JTA">
        <jta-data-source>jdbc/mariadb</jta-data-source>
        <class>com.yac.model.Address</class>
        <class>com.yac.model.Commande</class>
        <class>com.yac.model.CommandeLine</class>
        <class>com.yac.model.Dish</class>
        <class>com.yac.model.Dishtype</class>
        <class>com.yac.model.Ingredient</class>
        <class>com.yac.model.Payement</class>
        <class>com.yac.model.Profil</class>
        <class>com.yac.model.Restaurant</class>
        <class>com.yac.model.Userapp</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.target-database" value="MySQL"/>
        </properties>
    </persistence-unit>
</persistence>

我刚才在MySQL中的persistence.xml文件中指定了数据库平台,此时MariaDB是基于它的,因为列表中没有提到MariaDB。如果有其他建议,请不要犹豫,谢谢。

票数 0
EN

Stack Overflow用户

发布于 2022-02-24 23:04:51

另一种解决方案:将?useMysqlMetadata=true添加到JDBC连接中,如下所示:

代码语言:javascript
复制
<property name="URL" value="jdbc:mariadb://[HOST]:[PORT]/[DB NAME]?useMysqlMetadata=true"/>

这将使MariaDB使用MySQL元数据,然后eclipselink将将其检测为MySQL。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61690913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档