我正在尝试使用 Eclipselink 2.5.2 和 MySQL 制作一个简单的 Multi-Tenancy 示例来运行。
当尝试保留分配给租户 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;
.
.
.
持久性.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();
}
}
希望有人能告诉我我做错了什么。
最佳答案
Eclipselink 在 Multi-Tenancy 场景中不支持 DDL 生成。
请参阅此链接了解更多信息,https://wiki.eclipse.org/EclipseLink/DesignDocs/Multi-Tenancy/TablePerTenant
关于java - JPA Eclipselink Multitenant,表不存在错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33041846/