JPA 配置类实体映射示例
来源:互联网 发布:360网络电视直播 编辑:程序博客网 时间:2024/05/22 08:11
A: 两张表示例
/** * * @author xiaofanku@live.cn */@Entity@Table(name="apo_config")public class SiteConfig implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long ID; private String caption; @ElementCollection(fetch = FetchType.LAZY) @MapKeyColumn(name="name") @Column(name="value") @CollectionTable(name="apo_config_attributes", joinColumns=@JoinColumn(name="ca_id")) private Map<String, String> attributes = new HashMap<String, String>(); //GET/SET}
测试代码
@Test public void test(){ SiteConfig sc=new SiteConfig(); sc.setID(1L); sc.setCaption("全局配置"); Map<String, String> data=new HashMap<>(); data.put("site", "csdn.net"); data.put("account", "xiaofanku"); sc.setAttributes(data); siteConfigDao.save(sc); } @Test public void getConfig(){ SiteConfig config=siteConfigDao.findOne(1L); assertEquals(config.getAttributes().get("site"), "csdn.net"); }
apo_config:表结构
apo_config_attributes:表结构
B: 三张表示例
/** * * @author xiaofanku@live.cn */@Entity@Table(name="apo_config")public class SiteConfig implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long ID; private String caption; @OneToMany(cascade=CascadeType.ALL, orphanRemoval = true) @MapKey(name="name") @JoinTable(name = "apo_config_attributes") private Map<String, ConfigAttribute> attributes=new HashMap<>(); //GET/SET}
/** * * @author xiaofanku@live.cn */@Entity@Table(name="apo_attributes")public class ConfigAttribute implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long ID; @Column(name="name") private String name; private String value; //GET/SET}
测试代码
@Test @Ignore public void test(){ SiteConfig sc=new SiteConfig(); sc.setID(1L); sc.setCaption("全局配置"); Map<String, ConfigAttribute> data=new HashMap<>(); ConfigAttribute ca1=new ConfigAttribute(); ca1.setName("site");ca1.setValue("csdn.net"); data.put("site", ca1); ConfigAttribute ca2=new ConfigAttribute(); ca2.setName("account");ca2.setValue("xiaofanku"); data.put("account", ca2); sc.setAttributes(data); siteConfigDao.save(sc); } @Test @Ignore public void getConfig(){ SiteConfig config=siteConfigDao.findOne(1L); assertEquals(config.getAttributes().get("site").getValue(), "csdn.net"); }
apo_config:表结构
apo_attributes:表结构
apo_config_attributes:中间表结构
C: 使用ASF Commons BeanUtils来构造一个Dynamic Class
import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Objects;import java.util.Set;import org.apache.commons.beanutils.BasicDynaClass;import org.apache.commons.beanutils.ConvertUtils;import org.apache.commons.beanutils.DynaBean;import org.apache.commons.beanutils.DynaProperty;/** * 使用Commons Beanutils实现动态类 * @author xiaofanku@live.cn * @since 20171024 */public class DynamicClass{ private final DynaBean config; /** * 构造一个运态类型 * @param attributeMeta key属性名,value为属性名的类型,例:java.lang.Boolean * @throws IllegalAccessException * @throws InstantiationException * @throws ClassNotFoundException */ public DynamicClass(Map<String,String> attributeMeta) throws IllegalAccessException, InstantiationException, ClassNotFoundException{ DynaProperty[] props=covert(attributeMeta).toArray(new DynaProperty[]{}); BasicDynaClass dynaClass = new BasicDynaClass("CustomConfig", null, props); this.config = dynaClass.newInstance(); } /** * 构造一个运态类型 * @param attributes * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException */ public DynamicClass(Set<Attribute> attributes) throws ClassNotFoundException, IllegalAccessException, InstantiationException{ DynaProperty[] props=covert(attributes).toArray(new DynaProperty[]{}); BasicDynaClass dynaClass = new BasicDynaClass("CustomConfig", null, props); this.config = dynaClass.newInstance(); load(attributes); } /** * 获得属性值 * @param attributeName 属性名 * @return */ public Object getValue(String attributeName){ return config.get(attributeName); } /** * 获得属性值 * @param attributeName 属性名 * @param classType 属性类型 * @param <T> * @return * @throws java.lang.ClassCastException */ public <T> T getValue(String attributeName, Class<T> classType) throws java.lang.ClassCastException{ return (T)getValue(attributeName); } /** * 设置属性 * @param attributeName 属性名 * @param attributeValue 属性值 */ public void setValue(String attributeName, String attributeValue){ DynaProperty dp = config.getDynaClass().getDynaProperty(attributeName); config.set(attributeName, ConvertUtils.convert(attributeValue, dp.getType())); } /** * 设置属性 * @param attribute 属性实例 * @throws ClassNotFoundException */ public void setValue(Attribute attribute) throws ClassNotFoundException { config.set(attribute.getName(), ConvertUtils.convert(attribute.getValue(), Class.forName(attribute.getClassName()))); } /** * 装载属性集合,填充动态类实例 * @param attributes */ private void load(Set<Attribute> attributes){ for(Attribute attr : attributes){ try{ config.set(attr.getName(), ConvertUtils.convert(attr.getValue(), Class.forName(attr.getClassName()))); }catch(ClassNotFoundException e){ } } } /** * 返回一个DynaProperty列表 * @param attributes * @return * @throws ClassNotFoundException */ private List<DynaProperty> covert(Set<Attribute> attributes) throws ClassNotFoundException{ List<DynaProperty> attres=new ArrayList<>(); for(Attribute attr : attributes){ attres.add(new DynaProperty(attr.getName(), Class.forName(attr.getClassName()))); } return attres; } /** * 返回一个DynaProperty列表 * @param attributeMeta key属性名,value为属性名的类型,例:java.lang.Boolean * @return * @throws ClassNotFoundException */ private List<DynaProperty> covert(Map<String,String> attributeMeta) throws ClassNotFoundException{ List<DynaProperty> properties=new ArrayList<>(); Set<String> attrSet=attributeMeta.keySet(); for(String attrName : attrSet){ String className=attributeMeta.get(attrName); properties.add(new DynaProperty(attrName, Class.forName(className))); } return properties; } public static enum Type{ BOOLEAN("java.lang.Boolean"), INTEGER("java.lang.Integer"), LONG("java.lang.Long"), STRING("java.lang.String"), CHAR("java.lang.Character"), DOUBLE("java.lang.Double"), FLOAT("java.lang.Float"); private final String name; private Type(String className){ this.name=className; } public String getName() { return name; } } public static class Attribute{ //属性名,例:show private final String name; //属性名的值,例:"true" private final String value; //属性名的类型,例:java.lang.Boolean private final String className; public Attribute(String name, String value, String className) { this.name = name; this.value = value; this.className = className; } public String getName() { return name; } public String getValue() { return value; } public String getClassName() { return className; } @Override public int hashCode() { int hash = 5; hash = 97 * hash + Objects.hashCode(this.name); hash = 97 * hash + Objects.hashCode(this.className); return hash; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Attribute other = (Attribute) obj; if (!Objects.equals(this.name, other.name)) { return false; } if (!Objects.equals(this.className, other.className)) { return false; } return true; } }}
测试代码:
@Test public void test(){ Set<Attribute> sas=new HashSet<>(); sas.add(new Attribute("logo", "logo.png", DynamicClass.Type.STRING.getName())); sas.add(new Attribute("pageSize", "50", DynamicClass.Type.INTEGER.getName())); sas.add(new Attribute("shortcut", "true", DynamicClass.Type.BOOLEAN.getName())); try{ DynamicClass dc=new DynamicClass(sas); Integer ps = dc.getValue("pageSize", Integer.class); System.out.println(ps); dc.setValue("pageSize", "150"); System.out.println(dc.getValue("pageSize")); }catch(Exception e){ e.printStackTrace(); } } @Test @Ignore public void base() { Map<String, String> am = new HashMap<>(); am.put("logo", DynamicClass.Type.STRING.getName()); am.put("pageSize", DynamicClass.Type.INTEGER.getName()); am.put("shortcut", DynamicClass.Type.BOOLEAN.getName()); try { DynamicClass dc = new DynamicClass(am); dc.setValue("pageSize", "150"); System.out.println(dc.getValue("pageSize")); dc.setValue(new Attribute("shortcut", "true", DynamicClass.Type.BOOLEAN.getName())); System.out.println(dc.getValue("shortcut")); } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
最后说明:
JPA 2.1 实现 EclipseLink 2.5.2
JDK 1.8.x
Mysql 5.5.x
ASF Commons BeanUtils 1.8.3
阅读全文
0 0
- JPA 配置类实体映射示例
- PowerDesign —配置JPA映射 导出实体类
- JPA配置,逆向工程映射到Entity实体类
- JPA实体映射关系
- JPA实体基本映射
- JPA 实体映射
- JPA实体关系映射
- JPA:实体类注解配置
- Spring data jpa怎么配置一个实体类映射两张数据库表
- JPA实体多表映射
- JPA实体继承的映射
- JPA实体继承的映射
- JPA实体继承的映射
- JPA实体继承实体的映射策略
- JPA实体继承实体的映射策略
- JPA实体继承实体的映射策略
- JPA实体继承实体的映射策略
- JPA实体类自增长字段配置
- 2017
- Java:ASCII码排序
- Eclipse安装PyDev插件后,preference中不显示Pydev问题原因及解决办法
- 区块链智能合约底层编译环境搭建开发虚拟货币技术
- Java基础
- JPA 配置类实体映射示例
- < 笔记 > Git
- RS232串口通信原理
- 阿里云主机(Ubuntu16.04 64位)安装tomcat8并修改监听端口
- leetcode---linked-list-cycle---链表中点
- mybatis dao参数个数,和后面的xml的取值问题
- cmd中可以运行java,但不能运行javac命令
- CentOS--网络配置详解
- 解析xml的4种方法详解