jpa动态扩展sql_扩展您的JPA POJO

本文介绍了如何使用Eclipselink的@VirtualAccessMethods注解来动态扩展JPA POJO,允许在不修改核心代码的情况下为特定客户提供自定义属性。通过更新eclipselink-orm.xml文件,可以添加虚拟属性并映射到数据库列,从而实现客户化需求,同时保持产品代码的整洁和可维护性。
摘要由CSDN通过智能技术生成

jpa动态扩展sql

可扩展性是许多体系结构的重要特征。 它衡量是否容易(或困难)
它是在不影响现有核心系统功能的情况下添加或更改功能。

让我们举一个简单的例子。 假设您的公司拥有一个核心产品来跟踪体育俱乐部中的所有用户。 在您的产品体系结构中,您有一个由JPA POJO表示的域模型。 域模型包含许多POJO,当然包括用户POJO。

package com.alex.staveley.persistence
/**
 * User entity.  Represents Users in the Sports Club. 
 * * Note: The SQL to generate a table for this in MySQL is:
 *
 * CREATE TABLE USER (ID INT NOT NULL auto_increment, NAME varchar(255) NOT NULL, 
 *  PRIMARY KEY (ID)) ENGINE=InnoDB;
 */ 
@Entity
public class User {
    /* Surrogate Key - automatically generated by DB. */ 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Id
    private int id;
 
    private String name;

    public int getId() {
        return id;
    }
 
    public void setName(String name) {
        this.name=name;
    }
 
    public String getName() {
        return name;
    }
}

现在,一些客户喜欢您的产品,但是他们需要在购买之前进行一些自定义。 例如,
一位客户希望将属性出生地添加到用户,并希望此属性持续存在。 当然,此属性的逻辑位置是在用户POJO中,但是没有其他客户想要此属性。 所以你会怎么做?

您是否仅为此客户创建了特定的User类,然后才为他们交换了该类? 怎么了
当您更改产品用户类别时呢? 如果另一个客户想要另一个定制怎么办?
还是改变主意? 您是否感觉事情会变得混乱?

幸运的是,JPA的一种实现:Eclipselink在这里提供了帮助。 2.3版本 (自2011年6月开始提供,最新版本是2011年12月9日最近发布的2.3.2维护)包括一些非常好的功能,可以解决这种情况。 让我们详细说明。 通过将@VirtualAccessmethods Eclipselink注释简单地添加到POJO,我们向Eclipselink发出信号,表明POJO可能具有一些额外的( 也称为虚拟 )属性。 您不必在代码中指定任何这些额外的属性, 否则它们将不是非常虚拟的 ! 您只需要指定一个通用的getter和setter来满足他们的获取和设置。 您还必须在某个地方将它们存储在内存中,就像一个很好的旧哈希图–当然,这应该是暂时的,因为我们不保留哈希图本身。 注意:它们不必存储在HashMap中,这只是一个流行的选择!

让我们看一下我们现在可以扩展的用户。

@Entity
@VirtualAccessMethods
public class User {
    /* Surrogate Key - automatically generated by DB. */
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Id
    private int id;
  
    private String name;
  
    @Transient
    private Map<String, Object> extensions = new HashMap();
 
    public int getId() {
        return id;
    }
  
    public void setName(String name) {
        this.name=name;
    }
  
    public String getName() {
        return name;
    }
  
    public <t> T get(String name) {
        return (T) extensions.get(name);
    }
  
    public Object set(String name, Object value) {
        return extensions.put(name, value);
    } 
}

那是吗? 好吧,还有更多的魔术。 您必须告诉eclipselink您的其他属性。 更具体地说:它们的名称和数据类型是什么。
您可以通过更新eclipselink-orm.xml来做到这一点,该文件位于persistent.xml所在的同一META-INF文件夹中。

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/orm 
    http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_1.xsd"
    version="2.1">
 
    <entity class="com.alex.staveley.persistence.User">
        <attributes>
     <basic name="thebirthplace" attribute-type="String" access="VIRTUAL">
                <column name="birthplace"/>
                <access-methods get-method="get" set-method="set"/>
            </basic>
        </attributes>
    </entity> 
</entity-mappings>

现在,此配置简单说明,User实体具有一个附加属性,在Java中为“ thebirthplace”,并且是虚拟的。 这意味着它不是在POJO中明确定义的,但是如果我们要调试东西,我们会在内存中看到该属性的名称为“出生地”。

此配置还指出该属性的相应数据库列是出生地。
eclipselink可以使用通用的get / set方法来获取和设置此方法。

你想测试吗?

将该列添加到数据库表中。 在MySql中,这将是:

alter table用户添加列的出生地varchar(64)

然后运行以下简单测试:

@Test
public void testCreateUser() {
    User user = new User();
    user.setName("User1Name");
    user.set("thebirthplace", "donabate");
    entitymanager.getTransaction().begin();
    entitymanager.persist(user);
    entitymanager.getTransaction().commit();
    entitymanager.close();
}

因此,现在,我们可以在产品代码中拥有一个可扩展的用户POJO。 每个客户都可以根据需要将自己的属性添加到用户。 当然,每个客户都与
通过确保每个客户的扩展都驻留在特定的eclipslink-orm.xml中,可以非常轻松地实现所有其他客户。 请记住,您可以根据需要随意命名这些文件,如果不使用默认名称,则只需更新persistence.xml文件以声明正在使用的名称即可

这种方法意味着,当我们要更新产品中的User时,我们只需要更新一个,并且只更新User POJO( 因为我们确保只有一个 )。 但是,当必须为特定客户添加特定属性时,我们无需触摸用户POJO代码。 我们简单地对XML进行更改,而不必重新编译核心产品中的任何内容。 当然,在任何时候,只要查看适当的eclipselink-orm.file,就可以轻松了解针对任何客户的定制。

是的 快乐扩展!

参考文献:

  1. 都柏林的技术博客上,从我们的JCG合作伙伴 Alex Staveley 扩展您的JPA POJO
  2. http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Extensible_Entities
  3. http://www.eclipse.org/eclipselink/

相关文章 :


翻译自: https://www.javacodegeeks.com/2012/01/extending-your-jpa-pojos.html

jpa动态扩展sql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值