nutz
nutz copied to clipboard
dao创建外部load的实体时,表名错误
dao.create(User.class, false); 创建时没有获取到注解.
User.class是从外部的地止load到内存的,然后使用此方式创建数据库表,表名是类名而非注解里的定义的表名。
loader代码如下:
public class CustomClassLoader extends ClassLoader { public Class<?> findClass(String dir,String className) throws ClassNotFoundException { File classFile = new File(dir); if(!classFile.exists()){ throw new ClassNotFoundException(classFile.getPath() + " 不存在") ; } ByteArrayOutputStream bos = new ByteArrayOutputStream() ; ByteBuffer bf = ByteBuffer.allocate(1024) ; FileInputStream fis = null ; FileChannel fc = null ; try { fis = new FileInputStream(classFile) ; fc = fis.getChannel() ; while(fc.read(bf) > 0){ bf.flip() ; bos.write(bf.array(),0 , bf.limit()) ; bf.clear() ; } }catch (IOException e) { e.printStackTrace(); } finally{ try { fis.close() ; fc.close() ; } catch (IOException e) { e.printStackTrace(); } } return defineClass(className,bos.toByteArray() , 0 , bos.toByteArray().length); } }
controller里的代码如下:
`@RestController
public class NutzController {
private static final Logger logger = LoggerFactory.getLogger(NutzController.class);
@Autowired
Dao dao;
private final static CustomClassLoader CLASS_LOADER = new CustomClassLoader();
@GetMapping("/nutz/new")
public String registerNewEntity(@RequestParam(name = "name", required = true) String className) {
try {
String st="E:\\work\\cloud-hseapp\\target\\classes\\cn\\saper\\domain\\Test.class";
Class entityClass = CLASS_LOADER.findClass(st, "cn.saper.domain.Test");
dao.create(entityClass,false);
} catch (Exception e) {
logger.error(" registerBean error {} : ", className, e);
}
return "成功";
}
}
Test.java如下 :
package cn.saper.domain;
import org.nutz.dao.entity.annotation.Table;
import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size;
@Table( prefix = "Dns",value = "saper_test") public class Test {
@Id
@GeneratedValue
private Integer id;
@Size(min = 11, max = 11)
@Pattern(regexp = "[0-9]{11}")
private String phone;
@Size(min = 11, max = 11)
private String person;
} `
是不是有多个User类?dao.create之前,枚举一下这个class的注解信息就清楚了
ps: import错了也是很常见的