【问题标题】:JPA Eclipselink Multitenant, table doesn't exist errorJPA Eclipselink Multitenant,表不存在错误
【发布时间】:2016-01-07 14:43:42
【问题描述】:

我正在尝试使用 Eclipselink 2.5.2 和 MySQL 创建一个简单的多租户示例来运行。

当试图持久化分配给租户 ID 的实体时,mysql 服务器会抛出错误:“表 'jpatest.tenant1_userdata' 不存在”。 (userdata 是实体,jpatest 是数据库名称,tenant1 是租户 ID)

表确实不存在,数据库jpatest确实存在。每次我尝试使用新的租户 ID 持久化时,我都希望 eclipselink 自动生成表。

所以问题是: 如何强制 Eclipselink 创建表? 如果这是不可能的;如何在运行时创建表?

代码如下:

实体:

@Entity
@Table(name = "userdata")
@Multitenant(value = MultitenantType.TABLE_PER_TENANT)
@TenantTableDiscriminator(type = TenantTableDiscriminatorType.PREFIX, contextProperty = "tenant-id")
public class UserData implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private static final long serialVersionUID = 1L;
    private String name;

.
.
.

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/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_1.xsd">
    <persistence-unit name="MultiTeanantTest" transaction-type="RESOURCE_LOCAL">
        <class>UserData</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpatest" />

            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />
            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
            <property name="javax.persistence.schema-generation.create-database-schemas" value="true"/>
            <property name="eclipselink.ddl-generation" value="create-tables"/>
        </properties>
    </persistence-unit>
</persistence>

主类:

public class Main {

    public static void main(String[] args) {

        UserData ud = new UserData();
        ud.setNombre("John);
        Map properties = new HashMap<>();
        properties.put("tenant-id", "tenant1");

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("MultiTeanantTest", properties );
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();
        em.persist(ud);
        em.getTransaction().commit();

    }

}

希望有人能告诉我我做错了什么。

【问题讨论】:

  • 表创建用于开发,仅在部署持久性单元且租户信息不可用时预先运行一次。您需要预先生成脚本 - JPA 可以最初为您生成脚本,然后您修改它们,以便稍后可以使用租户数据执行它们。

标签: java mysql jpa eclipselink multi-tenant


【解决方案1】:

Eclipselink 不支持在多租户方案中生成 DDL。

请参阅此链接了解更多信息,https://wiki.eclipse.org/EclipseLink/DesignDocs/Multi-Tenancy/TablePerTenant

【讨论】:

  • 我在生成表格时遇到问题,我希望每次有新的租户 ID 时都会自动生成表格。我必须先生成所有表才能在运行时找到它们吗?
  • 这就是我为我的项目所做的,我有一个单独的代码来创建我的表的所有结构,然后使用 JPA 控制数据。
猜你喜欢
  • 2012-07-25
  • 1970-01-01
  • 2013-08-14
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多